# 实例001：数字组合
# **题目：**有四个数字：1、2、3、4，能组成多少个互不相同且无重复数字的三位数？各是多少？
#
# **程序分析：**遍历全部可能，把有重复的剃掉。
# total=0
# for i in range(1,5):
#     for j in range(1,5):
#         for k in range(1,5):
#             if ((i!=j)and(j!=k)and(k!=i)):
#                 print(i,j,k)
#                 total+=1
# print(total)
#
# **简便方法：**用itertools中的permutations即可。
# import itertools
# sum2=0
# a=[1,2,3,4]
# for i in itertools.permutations(a,3):
#     print(i)
#     sum2+=1
# print(sum2)


# 实例002：“个税计算”
# **题目：**企业发放的奖金根据利润提成。利润(I)低于或等于10万元时，奖金可提10%；
# 利润高于10万元，低于20万元时，低于10万元的部分按10%提成，高于10万元的部分，可提成7.5%；
# 20万到40万之间时，高于20万元的部分，可提成5%；
# 40万到60万之间时高于40万元的部分，可提成3%；60万到100万之间时，高于60万元的部分，可提成1.5%，
# 高于100万元时，超过100万元的部分按1%提成，从键盘输入当月利润I，求应发放奖金总数？
#
# **程序分析：**分区间计算即可。
# profit=int(input('Show me the money: '))
# bonus=0
# thresholds=[100000,100000,200000,200000,400000]
# rates=[0.1,0.075,0.05,0.03,0.015,0.01]
# for i in range(len(thresholds)):
#     if profit<=thresholds[i]:
#         bonus+=profit*rates[i]
#         profit=0
#         break
#     else:
#         bonus+=thresholds[i]*rates[i]
#         profit-=thresholds[i]
# bonus+=profit*rates[-1]
# print(bonus)


# 实例003：完全平方数
# **题目：**一个整数，它加上100后是一个完全平方数，再加上168又是一个完全平方数，请问该数是多少？
#
# **程序分析：**保证完全平方数开放之后的结果为整数， 然后循环判断查找:
# n = 0
# while True:
#     n += 1
#     if int((n+100)**0.5) == (n+100)**0.5 and int((n+268)**0.5) == (n+268)**0.5:
#         break
# print(n)


# 实例004：这天第几天
# **题目：**输入某年某月某日，判断这一天是这一年的第几天？
#
# **程序分析：**特殊情况，闰年时需考虑二月多加一天：
# def isLeapYear(y):
#     return (y%400==0 or (y%4==0 and y%100!=0))
# DofM=[0,31,28,31,30,31,30,31,31,30,31,30]
# res=0
# year=int(input('Year:'))
# month=int(input('Month:'))
# day=int(input('day:'))
# if isLeapYear(year):
#     DofM[2]+=1
# for i in range(month):
#     res+=DofM[i]
# print(res+day)


# 实例005：三数排序
# **题目：**输入三个整数x,y,z，请把这三个数由小到大输出。
#
# **程序分析：**练练手就随便找个排序算法实现一下，偷懒就直接调函数。
# list1 = []
# for i in range(3):
#     num = input(f"第{i+1}个数字：")
#     list1.append(int(num))
#
# for i in range(len(list1)):
#     for j in range(len(list1)):
#         if list1[i] >= list1[j]:
#             list1[i],list1[j] = list1[j],list1[i]
# print(list1)
#
# print(sorted(list1))


# 实例006：斐波那契数列
# **题目：**斐波那契数列。
#
# **程序分析：**斐波那契数列（Fibonacci sequence），从1,1开始，后面每一项等于前面两项之和。图方便就递归实现，图性能就用循环。
# 递归实现
# def fib(n):
#     if n<=2:
#         return 1
#     else:
#         return fib(n-1)+fib(n-2)
# print(fib(int(input("想要斐波那契数列第几个元素: "))))
# # 朴素实现
# target=int(input())
# res=0
# a,b=1,1
# for i in range(target-1):
#     a,b=b,a+b
# print(a)


# 实例007：copy
# **题目：**将一个列表的数据复制到另一个列表中。
#
# **程序分析：**使用列表[:]，拿不准可以调用copy模块。
# import copy
# a = [1,2,3,4,['a','b']]
#
# b = a					# 赋值
# c = a[:]				# 浅拷贝
# d = copy.copy(a)		# 浅拷贝
# e = copy.deepcopy(a)	# 深拷贝
#
# a.append(5)
# a[4].append('c')
#
# print('a=',a)
# print('b=',b)
# print('c=',c)
# print('d=',d)
# print('e=',e)
#
# ============ RESTART: F:\PyWorkspace\Python100\100examples\007.py ============
# a= [1, 2, 3, 4, ['a', 'b', 'c'], 5]
# b= [1, 2, 3, 4, ['a', 'b', 'c'], 5]
# c= [1, 2, 3, 4, ['a', 'b', 'c']]
# d= [1, 2, 3, 4, ['a', 'b', 'c']]
# e= [1, 2, 3, 4, ['a', 'b']]


# 实例008:九九乘法表
# **题目：**输出 9*9 乘法口诀表。
#
# **程序分析：**分行与列考虑，共9行9列，i控制行，j控制列。
# for i in range(1,10):
#     for j in range(1,i+1):
#         print(f"{i} x {j} = {i*j}",end=" ")
#     print()


# 实例009：暂停一秒输出
# **题目：**暂停一秒输出。
#
# **程序分析：**使用 time 模块的 sleep() 函数。
# import time
# for i in range(4):
#     print(str(int(time.time()))[-2:])
#     time.sleep(1)


# 实例010：给人看的时间
# **题目：**暂停一秒输出，并格式化当前时间。
#
# **程序分析：**同009.
# import time
#
# for i in range(4):
#     print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
#     time.sleep(1)


# 实例011：养兔子
# **题目：**有一对兔子，从出生后第3个月起每个月都生一对兔子，小兔子长到第三个月后每个月又生一对兔子
# 假如兔子都不死，问每个月的兔子总数为多少？
#
# **程序分析：**一月兔二月兔数量都为1对，三月开始变成2对，四月第一对再生变成3对，五月第一第二对兔子都可以生变成5对，所以兔子对数为【1，1，2，3，5...】斐波那契数列，所以：
# def fib(n):
#     if n <= 2:
#         return 2
#     else:
#         return 2*fib(n-1) + 2*fib(n-2)
# print(fib(int(input("想知道第几个月兔子数量？"))))


# 实例012:100到200的素数
# **题目：**判断101-200之间有多少个素数，并输出所有素数。
#
# **程序分析：**判断素数的方法：用一个数分别去除2到sqrt(这个数)，如果能被整除，则表明此数不是素数，反之是素数。
# n = 0
# for i in range(101,201):
#     if not [j for j in range(2,i) if i % j == 0]:
#         n += 1
#         print(i)
# print(n)


# 实例013：所有水仙花数
# **题目：**打印出所有的"水仙花数"，所谓"水仙花数"是指一个三位数，其各位数字立方和等于该数本身。例如：153是一个"水仙花数"，因为153=1的三次方＋5的三次方＋3的三次方。
#
# **程序分析：**利用for循环控制100-999个数，每个数分解出个位，十位，百位。
# for i in range(100,1000):
#     if (i % 10)**3 + (i // 100)**3 + ((i // 10) %10)**3 == i:
#         print(i)


# 实例014：分解质因数
# **题目：**将一个整数分解质因数。例如：输入90,打印出90=233*5。
#
# **程序分析：**根本不需要判断是否是质数，从2开始向数本身遍历，能整除的肯定是最小的质数。
# def prime_factors_basic(n):
#     if n <= 1:
#         print(f"{n} = {n}")
#
#     original = n
#     factors = []
#     divisor = 2
#
#     while n > 1:
#         if n % divisor == 0:
#             factors.append(divisor)
#             n = n // divisor
#         else:
#             divisor += 1
#     print(f"{original} = {factors}")
#
# prime_factors_basic(int(input("Enter a number: ")))


# 实例015：分数归档
# **题目：**利用条件运算符的嵌套来完成此题：学习成绩>=90分的同学用A表示，60-89分之间的用B表示，60分以下的用C表示。
#
# **程序分析：**用条件判断即可。
# def score(num):
#     if num >= 90:
#         return 'A'
#     elif 89 >= num >= 60:
#         return 'B'
#     elif num <= 60:
#         return 'C'
#
# print(score(int(input("成绩是："))))


# 实例016：输出日期
# **题目：**输出指定格式的日期。
#
# **程序分析：**使用 datetime 模块。
# import datetime
# print(datetime.date.today())
# print(datetime.date(2333,2,3))
# print(datetime.date.today().strftime('%d/%m/%Y'))
# day=datetime.date(1111,2,3)
# day=day.replace(year=day.year+22)
# print(day)


# 实例017：字符串构成
# **题目：**输入一行字符，分别统计出其中英文字母、空格、数字和其它字符的个数。
#
# **程序分析：**利用 while 或 for 语句,条件为输入的字符不为 '\n'。
# def str_ju(string):
#     alp=0
#     num=0
#     spa=0
#     oth=0
#     for i in range(len(string)):
#         if string[i].isspace():
#             spa+=1
#         elif string[i].isdigit():
#             num+=1
#         elif string[i].isalpha():
#             alp+=1
#         else:
#             oth+=1
#     print('space: ',spa)
#     print('digit: ',num)
#     print('alpha: ',alp)
#     print('other: ',oth)
# str_ju(input("要分析的字符串："))


# 实例018：复读机相加
# **题目：**求s=a+aa+aaa+aaaa+aa...a的值，其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加)，几个数相加由键盘控制。
#
# **程序分析：**用字符串解决。
# def compute(n,num):
#     result = 0
#     for i in range(1,num+1):
#         result += int(f"{n}" * i)
#     return result
# print(compute(1,4))


# 实例019：完数
# **题目：**一个数如果恰好等于它的因子之和，这个数就称为"完数"。例如6=1＋2＋3.编程找出1000以内的所有完数。
#
# for i in range(1,1001):
#     res = 0
#     for j in range(1,i):
#         if i % j == 0:
#             res += j
#     if res == i:
#         print(i)


# 实例020：高空抛物
# **题目：**一个球从100米高度自由落下，每次落地后反跳回原高度的一半；再落下，求它在第10次落地时，共经过多少米？第10次反弹多高？
#
# **程序分析：**无
# distance = 100
# high = 100
# for i in range(1,10):
#     distance += high
#     high /= 2
# print(distance)


# 实例021：猴子偷桃
# **题目：**猴子吃桃问题：猴子第一天摘下若干个桃子，当即吃了一半，还不瘾，又多吃了一个第二天早上又将剩下的桃子吃掉一半，又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时，见只剩下一个桃子了。求第一天共摘了多少。
#
# **程序分析：**按规则反向推断：猴子有一个桃子，他偷来一个桃子，觉得不够又偷来了与手上等量的桃子，一共偷了9天。
# peach_num = 1
# for i in range(9):
#     peach_num = (peach_num + 1) * 2
# print(peach_num)


# 实例022：比赛对手
# **题目：**两个乒乓球队进行比赛，各出三人。甲队为a,b,c三人，乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比，c说他不和x,z比，请编程序找出三队赛手的名单。
#
# **程序分析：**找到条件下不重复的三个对手即可。
# # 甲队队员
# team_a = ['a', 'b', 'c']
# # 乙队队员
# team_b = ['x', 'y', 'z']
#
# # 生成所有可能的对阵组合
# for a_vs in team_b:
#     for b_vs in team_b:
#         for c_vs in team_b:
#             # 确保每个乙队队员只与一个甲队队员比赛
#             if len(set([a_vs, b_vs, c_vs])) == 3:
#                 # 条件1：a不和x比
#                 # 条件2：c不和x,z比，即c只能和y比
#                 if a_vs != 'x' and c_vs != 'x' and c_vs != 'z':
#                     print(f"比赛对阵：")
#                     print(f"a vs {a_vs}")
#                     print(f"b vs {b_vs}")
#                     print(f"c vs {c_vs}")


# 实例023：画菱形
# **题目：**打印出如下图案（菱形）:
#        *
#       ***
#      *****
#     *******
#      *****
#       ***
#        *
# **程序分析：**递归调用即可。
# def draw(num):
#     a="*"*(2*(4-num)+1)
#     print(a.center(9,' '))
#     if num!=1:
#         draw(num-1)
#         print(a.center(9,' '))
# draw(4)


# 实例024：斐波那契数列II
# **题目：**有一分数序列：2/1，3/2，5/3，8/5，13/8，21/13...求出这个数列的前20项之和。
#
# **程序分析：**就是斐波那契数列的后一项除以前一项。
# 递归实现
# a = 2
# b = 1
# num = 0
# for i in range(1,21):
#     num += a / b
#     a, b = a+b, a
# print(num)


# 实例025： 阶乘求和
# **题目：**求1+2!+3!+...+20!的和。
#
# **程序分析：**1+2!+3!+...+20!=1+2(1+3(1+4(...20(1))))
# 时间复杂度O(n^2)
# b = 0
# for i in range(1,21):
#     a = 1
#     for j in range(1,i+1):
#         a *= j
#     b += a
# print(b)
# 时间复杂度O(n)
# res=1
# for i in range(20,1,-1):
#     res=i*res+1
# print(res)


# 实例026：递归求阶乘
# **题目：**利用递归方法求5!。
#
# **程序分析：**递归调用即可。
# def factorial(n):
#     result = 0
#     if n > 1:
#         result *= n * factorial(n-1)
#     else:
#         result = 1
#     return result


# 实例027：递归输出
# **题目：**利用递归函数调用方式，将所输入的5个字符，以相反顺序打印出来。
#
# **程序分析：**递归真是蠢方法。
# def rec(string):
#     if len(string) == 1:
#         print(string)
#     else:
#         print(string[-1])
#         string = string[:-1]
#         rec(string)
# rec('china')


# 实例028：递归求等差数列
# **题目：**有5个人坐在一起，问第五个人多少岁？他说比第4个人大2岁。问第4个人岁数，他说比第3个人大2岁。问第三个人，又说比第2人大两岁。问第2个人，说比第一个人大两岁。最后问第一个人，他说是10岁。请问第五个人多大？
#
# **程序分析：**就一等差数列。
# def age(n):
#     if n == 1:
#         return 10
#     else:
#         return age(n-1) + 2
# print(age(5))


# 实例029：反向输出
# **题目：**给一个不多于5位的正整数，要求：一、求它是几位数，二、逆序打印出各位数字。
#
# **程序分析：**学会分解出每一位数,用字符串的方法总是比较省事。
# def num(n):
#     print(f"{len(str(n))}位数")
#     print(str(n)[::-1])
# num(12345)


# 实例030：回文数
# **题目：**一个5位数，判断它是不是回文数。即12321是回文数，个位与万位相同，十位与千位相同。
#
# **程序分析：**用字符串比较方便,就算输入的不是数字都ok。
# num = input("Enter a number: ")
# if num[-1]==num[0] and num[-2]==num[1]:
#     print("yes")
# else:
#     print("no")

# 实例031：字母识词
# **题目：**请输入星期几的第一个字母来判断一下是星期几，如果第一个字母一样，则继续判断第二个字母。
#
# **程序分析：**这里用字典的形式直接将对照关系存好。
# weekT = {
#     'h': 'thursday',
#     'u': 'tuesday',
# }
# weekS = {
#     'a': 'saturday',
#     'u': 'sunday',
# }
# week = {
#     'm' : 'Monday',
#     't' : weekT,
#     'w' : 'Wednesday',
#     'f' : 'Friday',
#     's' : weekS,
# }
# str1 = input().lower()
# if str1 == 't' or str1 == 's':
#     str2 = input().lower()
#     print(week[str1][str2])
# else:
#     print(week[str1])


# 实例033：列表转字符串
# **题目：**按逗号分隔列表。
# L = [1,2,3,4,5]
# print(','.join(str(n) for n in L))


# 实例035：设置输出颜色
# **题目：**文本颜色设置。
# class bcolors:
#     HEADER = '\033[95m'
#     OKBLUE = '\033[94m'
#     OKGREEN = '\033[92m'
#     WARNING = '\033[93m'
#     FAIL = '\033[91m'
#     ENDC = '\033[0m'
#     BOLD = '\033[1m'
#     UNDERLINE = '\033[4m'
# print(bcolors.WARNING + "警告的颜色字体" + bcolors.ENDC)


# 实例036：算素数
# **题目：**求100之内的素数。
#
# **程序分析：**用else执行for循环的奖励代码（如果for是正常完结，非break）。
# for i in range(1,101):
#     if not [j for j in range(2,i) if i % j == 0]:
#         print(i)


# 实例037：排序
# **题目：**对10个数进行排序。
#
# **程序分析：**同实例005。
# raw = []
# for i in range(10):
#     x = int(input('int%d: ' % (i)))
#     raw.append(x)
#
# for i in range(len(raw)):
#     for j in range(i, len(raw)):
#         if raw[i] > raw[j]:
#             raw[i], raw[j] = raw[j], raw[i]
# print(raw)


# 实例038：矩阵对角线之和
# **题目：**求一个3*3矩阵主对角线元素之和。
# **主对角线就是左上角到右下角的对角线**
# mat = [
#     [1,2,3],
#     [4,5,6],
#     [7,8,9]
# ]
# res = 0
# for i in range(len(mat)):
#     res += mat[i][i]
# print(res)


# 实例039：有序列表插入元素
# **题目：**有一个已经排好序的数组。现输入一个数，要求按原来的规律将它插入数组中。
#
# **程序分析：
# **遍历列表，只要比num小的数就插进去，大的就不变
# **也可以直接插进去然后给列表排序输出
# def insert_num(num,lis):
#     lis.append(num)
#     for item in lis:
#         if num >= item:
#             lis.remove(num)
#             lis.insert(lis.index(item),num)
#
# lis1 = [1,33,38,76,85,97,104,112,135]
# insert_num(87,lis1)
# print(lis1)


# 实例044：矩阵相加
# **题目：**计算两个矩阵相加。
#
# **程序分析：**创建一个新的矩阵，使用 for 迭代并取出 X 和 Y 矩阵中对应位置的值，相加后放到新矩阵的对应位置中。
# X = [[12, 7, 3],
#      [4, 5, 6],
#      [7, 8, 9]]
#
# Y = [[5, 8, 1],
#      [6, 7, 3],
#      [4, 5, 9]]
#
# res = [[0, 0, 0],
#        [0, 0, 0],
#        [0, 0, 0]]
# for i in range(len(res)):
#     for j in range(len(res[0])):
#         res[i][j] = X[i][j] + Y[i][j]
# print(res)


# 实例061：杨辉三角
# **题目：**打印出杨辉三角形前十行。　　
# def generate_pascal_triangle(n):
#     triangle = []
#     for i in range(n):
#         row = [1] * (i + 1)  # 每行初始化为1
#         for j in range(1, i):
#             # 每个元素等于上方两个元素之和
#             row[j] = triangle[i-1][j-1] + triangle[i-1][j]
#         triangle.append(row)
#     return triangle
# # 生成前10行
# triangle = generate_pascal_triangle(10)
# # 打印结果
# for row in triangle:
#     print(' '.join(map(str, row)).center(50))



# 编程题答案：
# 1.冒泡排序
# def sort1(arr):
#     length = len(arr)
#     for i in range(length):
#         for j in range(length - i - 1):
#             if arr[j] > arr[j + 1]:
#                 arr[j], arr[j + 1] = arr[j + 1], arr[j]
#     return arr
#
# list1 = [60, 5, 58, 15, 64, 17, 25, 3, 63, 76]
# print(sort1(list1))


# 2.选择排序**
# def sort2(arr):
#     length = len(arr)
#     for i in range(length):
#         min_index = i
#         for j in range(i+1, length):
#             if arr[j] < arr[min_index]:
#                 min_index = j
#         arr[min_index], arr[i] = arr[i], arr[min_index]
#     return arr
#
# list2 = [97, 53, 51, 75, 13, 8, 34, 55, 40, 40]
# print(sort2(list2))


# 3.二分查找**
# def search(arr,num):
#     arr.sort()
#     left, right = 0, len(arr)-1
#     while left <= right:
#         mid = (left+right)//2
#         if arr[mid] == num:
#             return mid
#         elif arr[mid] < num:
#             left = mid + 1
#         else:
#             right = mid - 1
#     return -1  # 没查到返回-1
#
# list3 = [53, 93, 36, 55, 18, 28, 14, 14, 82,37]
# print(search(list3,55))


# 4.数字组合
# import itertools
# sum1 = 0
# a = [1,2,3,4]
# for i in itertools.permutations(a,3):
#     print(i)
#     sum1 += 1
# print(sum1)


# 5.递归实现斐波那契数列
# def fib(n):
#     if n <= 1:
#         return 1
#     else:
#         return fib(n-1) + fib(n-2)
#
# print(fib(9))


# 6.判断输出素数
# num = 0
# for i in range(100, 201):
#     if not [j for j in range(2,i) if i % j == 0]:
#         print(i)
#         num += 1
# print(num)


# 7.判断输出水仙花数
# for i in range(100,1000):
#     one = i % 10
#     ten = i // 10 % 10
#     hun = i // 100
#     if one**3 + ten**3 + hun**3 == i:
#         print(i)


# 8.判断输出完数
# for i in range(1,1000):
#     res = 0
#     for j in range(1,i):
#         if i % j == 0:
#             res += j
#     if res == i:
#         print(i)


# 9.回文判断
# sum1 = 0
# for i in range(100,200):
#     if int(str(i)[0]) == int(str(i)[2]):
#         print(i)
#         sum1 += 1
# print(sum1)

# 10.字符串最长无重复字符串判断**
# s = 'abcabcdd'
# char_set = set()
# left = 0
# max_len = 0
# for right in range(len(s)):
#     while s[right] in char_set:
#         char_set.remove(s[left])
#         left += 1
#     char_set.add(s[right])
#     max_len = max(max_len, right - left + 1)
# print(max_len)


# 11.

# 12.倒序输出列表
# def string(s):
#     return s[::-1]
# print(string('hello'))


# 13.杨辉三角**
# def generate(n):
#     triangle = []
#     for i in range(n):
#         row = [1] * (i+1)
#         for j in range(1,i):
#             row[j] = triangle[i-1][j-1] + triangle[i-1][j]
#         triangle.append(row)
#     return triangle
# print(generate(5))


# 14.山峰
# def mountain(nums):
#     n = len(nums)
#     for i in range(n):
#         if nums[i] > nums[i-1] and nums[i] > nums[i+1]:
#             print(1,nums[i])
# nums = [2,4,1,2,7,8,4]
# mountain(nums)






